#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <chrono>
#include <string>

using namespace std::chrono_literals;

int main() {
    std::queue<int> data_queue;
    std::mutex mtx;
    std::condition_variable_any cv;
    
    // 使用 jthread 创建工作线程
    std::jthread worker([&](std::stop_token stoken) {
        while (true) {
            std::unique_lock lock(mtx);
            
            // 使用可中断的等待：条件满足或停止请求
            if (cv.wait(lock, stoken, [&] { 
                return !data_queue.empty() || stoken.stop_requested(); 
            })) {
                // 检查停止请求
                if (stoken.stop_requested()) {
                    std::cout << "Worker: Stop requested, exiting\n";
                    break;
                }
                
                // 处理数据
                int data = data_queue.front();
                data_queue.pop();
                lock.unlock();
                
                std::cout << "Processing: " << data << "\n";
                std::this_thread::sleep_for(100ms); // 模拟工作
            }
        }
    });
    
    // 主线程生产数据
    for (int i = 1; i <= 5; ++i) {
        {
            std::lock_guard lock(mtx);
            data_queue.push(i);
            std::cout << "Produced: " << i << "\n";
        }
        cv.notify_one();
        std::this_thread::sleep_for(200ms);
    }
    
    // 等待所有数据处理完成
    std::this_thread::sleep_for(1s);
    
    // 优雅停止工作线程
    // std::cout << "Requesting stop...\n";
    // worker.request_stop();
    // cv.notify_all(); // 确保唤醒等待中的线程
    
    // jthread 析构时会自动 join
    return 0;
}
